package com.hhh.springai_test.exception;


import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotRoleException;
import com.hhh.springai_test.common.BaseResponse;
import com.hhh.springai_test.common.ErrorCode;
import com.hhh.springai_test.common.ResultUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理类
 * 用于统一处理项目中的异常
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 业务异常处理方法
     * 处理自定义的业务异常
     *
     * @param e 业务异常实例，包含错误代码和消息
     * @return 返回一个包含错误信息的响应对象
     */
    @ExceptionHandler(BusinessException.class)
    public BaseResponse<?> businessExceptionHandler(BusinessException e){
        // 记录业务异常日志
        log.error("BusinessException",e);
        // 返回错误响应，包含异常的错误代码和消息
        return ResultUtils.error(e.getCode(),e.getMessage());
    }

    @ExceptionHandler(NotRoleException.class)
    public BaseResponse<?> notRoleExceptionHandler(RuntimeException e) {
        log.error("NotRoleException", e);
        return ResultUtils.error(ErrorCode.NOT_AUTH_CODE, "无权限");
    }

    @ExceptionHandler(NotLoginException.class)
    public BaseResponse<?> notLoginExceptionHandler(RuntimeException e) {
        log.error("NotLoginException", e);
        return ResultUtils.error(ErrorCode.NO_LOGIN_CODE, "未登录");
    }
    /**
     * 运行时异常处理方法
     * 处理项目中的运行时异常
     *
     * @param e 运行时异常实例
     * @return 返回一个包含系统错误信息的响应对象
     */
    @ExceptionHandler(RuntimeException.class)
    public BaseResponse<?> runtimeExceptionHandler(RuntimeException e) {
        // 记录运行时异常日志
        log.error("RuntimeException", e);
        // 返回错误响应，错误代码为系统错误，消息为系统错误
        return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统错误");
    }
}

